package com.swak.hashmap;

/**
 * 最主要的一块是 Hash 算法： <br>
 * 1. 均衡 <br>
 * 2. 局部数据的分散，也就是热点分离 <br>
 * 
 * @author lifeng
 */
public class HashAlg {

	static final int MAXIMUM_CAPACITY = 1 << 30;

	/**
	 * 移位操作是为了把最高位为1后面的位全部变为1 （最高位为n）<br>
	 * 加1操作是为了进一位 （最高位为 n + 1）<br>
	 * 
	 * @param cap
	 * @return
	 */
	static final int tableSizeFor(int cap) {
		int n = cap - 1;
		n |= n >>> 1;
		n |= n >>> 2;
		n |= n >>> 4;
		n |= n >>> 8;
		n |= n >>> 16;
		return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
	}

	public static void main(String[] args) {

		// 10个元素， n 表示序号
		int n = 15;

		// 数据的hash值
		int hashCode1 = 1, hashCode2 = 2, hashCode3 = 3;

		// 使用的slot 位
		int i1 = n & hashCode1, i2 = n & hashCode2, i3 = n & hashCode3;
		System.out.println("基本：" + i1 + ";" + i2 + ";" + i3);

		// hashCode 充分的使用更多的位： 使用 |
		i1 = n & (hashCode1 | (hashCode1 >>> 16));
		i2 = n & (hashCode2 | (hashCode2 >>> 16));
		i3 = n & (hashCode3 | (hashCode3 >>> 16));
		System.out.println("|：" + i1 + ";" + i2 + ";" + i3);

		// hashCode 充分的使用更多的位： 使用 ^
		i1 = n & (hashCode1 ^ (hashCode1 >>> 16));
		i2 = n & (hashCode2 ^ (hashCode2 >>> 16));
		i3 = n & (hashCode3 ^ (hashCode3 >>> 16));
		System.out.println("^：" + i1 + ";" + i2 + ";" + i3);

		//
		System.out.println(tableSizeFor(5));
	}
}
